package com.smart.community.commons.websocket.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * WebSocket配置属性
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 */
@Data
@Component
@ConfigurationProperties(prefix = "websocket")
public class WebSocketProperties {

    /**
     * WebSocket端点路径
     */
    private String endpoint = "/ws";

    /**
     * 允许的源域名（CORS配置）
     */
    private String[] allowedOrigins = {"*"};

    /**
     * 会话超时时间（分钟）
     */
    private int sessionTimeoutMinutes = 30;

    /**
     * 心跳检测间隔（秒）
     */
    private int heartbeatIntervalSeconds = 30;

    /**
     * 消息重试次数
     */
    private int maxRetryCount = 3;

    /**
     * 消息重试延迟（毫秒）
     */
    private long retryDelayMs = 5000;

    /**
     * 会话清理间隔（分钟）
     */
    private int cleanupIntervalMinutes = 5;

    /**
     * 消息队列大小
     */
    private int messageQueueSize = 1000;

    /**
     * 是否启用消息持久化
     */
    private boolean enableMessagePersistence = true;

    /**
     * 消息持久化时间（小时）
     */
    private int messagePersistenceHours = 24;

    /**
     * 是否启用统计功能
     */
    private boolean enableStatistics = true;

    /**
     * 统计信息保存时间（天）
     */
    private int statisticsRetentionDays = 7;

    /**
     * 是否启用连接池
     */
    private boolean enableConnectionPool = true;

    /**
     * 连接池大小
     */
    private int connectionPoolSize = 100;

    /**
     * 是否启用SSL
     */
    private boolean enableSsl = false;

    /**
     * SSL证书路径
     */
    private String sslCertificatePath;

    /**
     * SSL私钥路径
     */
    private String sslPrivateKeyPath;

    /**
     * 是否启用压缩
     */
    private boolean enableCompression = true;

    /**
     * 压缩级别（1-9）
     */
    private int compressionLevel = 6;

    /**
     * 是否启用日志记录
     */
    private boolean enableLogging = true;

    /**
     * 日志级别
     */
    private String logLevel = "INFO";

    /**
     * 是否启用监控
     */
    private boolean enableMonitoring = true;

    /**
     * 监控指标收集间隔（秒）
     */
    private int monitoringIntervalSeconds = 60;

    /**
     * 是否启用安全验证
     */
    private boolean enableSecurity = true;

    /**
     * 安全验证超时时间（秒）
     */
    private int securityTimeoutSeconds = 30;

    /**
     * 是否启用限流
     */
    private boolean enableRateLimit = true;

    /**
     * 限流速率（消息/秒）
     */
    private int rateLimitPerSecond = 100;

    /**
     * 限流窗口大小（秒）
     */
    private int rateLimitWindowSeconds = 60;

    /**
     * 是否启用黑名单
     */
    private boolean enableBlacklist = true;

    /**
     * 黑名单检查间隔（分钟）
     */
    private int blacklistCheckIntervalMinutes = 10;

    /**
     * 是否启用白名单
     */
    private boolean enableWhitelist = false;

    /**
     * 白名单IP列表
     */
    private String[] whitelistIps = {};

    /**
     * 是否启用消息过滤
     */
    private boolean enableMessageFilter = true;

    /**
     * 消息过滤关键词
     */
    private String[] filterKeywords = {};

    /**
     * 是否启用消息加密
     */
    private boolean enableEncryption = false;

    /**
     * 加密密钥
     */
    private String encryptionKey;

    /**
     * 是否启用消息签名
     */
    private boolean enableSignature = false;

    /**
     * 签名密钥
     */
    private String signatureKey;

    /**
     * 是否启用消息压缩
     */
    private boolean enableMessageCompression = true;

    /**
     * 消息压缩阈值（字节）
     */
    private int messageCompressionThreshold = 1024;

    /**
     * 是否启用消息缓存
     */
    private boolean enableMessageCache = true;

    /**
     * 消息缓存大小
     */
    private int messageCacheSize = 1000;

    /**
     * 消息缓存过期时间（分钟）
     */
    private int messageCacheExpireMinutes = 30;

    /**
     * 是否启用房间管理
     */
    private boolean enableRoomManagement = true;

    /**
     * 最大房间数量
     */
    private int maxRoomCount = 1000;

    /**
     * 房间用户数量限制
     */
    private int maxRoomUserCount = 100;

    /**
     * 是否启用用户管理
     */
    private boolean enableUserManagement = true;

    /**
     * 最大在线用户数量
     */
    private int maxOnlineUserCount = 10000;

    /**
     * 用户会话超时时间（分钟）
     */
    private int userSessionTimeoutMinutes = 30;

    /**
     * 是否启用消息队列
     */
    private boolean enableMessageQueue = true;

    /**
     * 消息队列类型（memory/redis/rabbitmq）
     */
    private String messageQueueType = "memory";

    /**
     * Redis消息队列配置
     */
    private RedisMessageQueue redisMessageQueue = new RedisMessageQueue();

    /**
     * RabbitMQ消息队列配置
     */
    private RabbitMQMessageQueue rabbitMQMessageQueue = new RabbitMQMessageQueue();

    /**
     * Redis消息队列配置
     */
    @Data
    public static class RedisMessageQueue {
        /**
         * Redis主机
         */
        private String host = "localhost";

        /**
         * Redis端口
         */
        private int port = 6379;

        /**
         * Redis密码
         */
        private String password;

        /**
         * Redis数据库索引
         */
        private int database = 0;

        /**
         * 连接超时时间（毫秒）
         */
        private int connectionTimeout = 2000;

        /**
         * 读取超时时间（毫秒）
         */
        private int readTimeout = 2000;

        /**
         * 连接池大小
         */
        private int poolSize = 10;
    }

    /**
     * RabbitMQ消息队列配置
     */
    @Data
    public static class RabbitMQMessageQueue {
        /**
         * RabbitMQ主机
         */
        private String host = "localhost";

        /**
         * RabbitMQ端口
         */
        private int port = 5672;

        /**
         * RabbitMQ用户名
         */
        private String username = "guest";

        /**
         * RabbitMQ密码
         */
        private String password = "guest";

        /**
         * RabbitMQ虚拟主机
         */
        private String virtualHost = "/";

        /**
         * 连接超时时间（毫秒）
         */
        private int connectionTimeout = 60000;

        /**
         * 心跳间隔（秒）
         */
        private int heartbeatInterval = 60;

        /**
         * 自动重连
         */
        private boolean automaticRecovery = true;

        /**
         * 重连延迟（毫秒）
         */
        private int recoveryDelay = 5000;
    }
}
